package plataforma.cih;

import java.util.Set;

import nucleo.comuns.util.NucleoMensagens;

import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Toolbar;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Vlayout;

import plataforma.base.cci.CtrlExcecoes;

public abstract class PainelCadastroSimples extends Vlayout {

	private static final long serialVersionUID = 8896639132796378556L;

	protected Toolbar toolbar = new Toolbar();

	protected ListagemSimples listagem;

	protected Toolbarbutton tbbtNovo = new Toolbarbutton();
	protected Toolbarbutton tbbtAbrir = new Toolbarbutton();
	protected Toolbarbutton tbbtCancelar = new Toolbarbutton();	

	public PainelCadastroSimples() {
		 configurarComponentes();
	}

	public abstract ListagemSimples definirListagem();

	public void configurarComponentes() {
		definirComponentes();
		definirComponentesExtensao();
		validarComponentesExtensao();

		listagem.configurarComponentes();

		montar();
	}

	public ListagemSimples getListagem() {
		return listagem;
	}

	public void setListagem(ListagemSimples listagem) {
		this.listagem = listagem;
	}

	protected void montar() {
		toolbar.setParent(this);
		listagem.setParent(this);
	}

	/** Reimplemente esse metodo caso queria adicionar novos botoes de acao */
	protected void definirComponentesExtensao() {

	}

	protected void validarComponentesExtensao() {

		if (listagem == null)
			throw CtrlExcecoes.factoryExcecaoDefinicao("listagemPaginada",
					this.getClass());

	}

	protected Toolbar definirBarraFerramentas() {

		tbbtNovo.setImage("/imagens/filenew.png");
		tbbtNovo.setLabel("Novo Item");

		tbbtAbrir.setImage("/imagens/fileopen.png");
		tbbtAbrir.setLabel("Editar");

		tbbtCancelar.setImage("/imagens/editdelete.png");
		tbbtCancelar.setLabel("Cancelar");

		tbbtNovo.setParent(toolbar);
		tbbtAbrir.setParent(toolbar);
		tbbtCancelar.setParent(toolbar);

		tbbtNovo.addEventListener("onClick", new EventListenerNovo());
		tbbtAbrir.addEventListener("onClick", new EventListenerAbrir());
		tbbtCancelar.addEventListener("onClick", new EventListenerCancelar());

		return toolbar;

	}

	protected void definirComponentes() {
		setStyle("overflow:auto");
		toolbar = definirBarraFerramentas();
		listagem = definirListagem();
	}
	
	public abstract void acaoBotaoNovo();

	public abstract void acaoBotaoAbrir();

	public abstract void acaoBotaoCancelar();

	/** Classe do evento do botao novo. */
	private class EventListenerNovo implements EventListener {

		public void onEvent(Event event) {
			acaoBotaoNovo();
		}

		@SuppressWarnings("unused")
		public boolean isAsap() {
			return true;
		}

	}

	private class EventListenerCancelar implements EventListener {

		public void onEvent(Event event) {
			if (isUnicoItemSelecionado())
				acaoBotaoCancelar();

		}

		@SuppressWarnings("unused")
		public boolean isAsap() {
			return true;
		}

	}

	private class EventListenerAbrir implements EventListener {


		public void onEvent(Event event) {
			

			Set itensSelecionados = listagem.getSelecionados();

			if (isUnicoItemSelecionado()) {
				acaoBotaoAbrir();
			} 
		}

		@SuppressWarnings("unused")
		public boolean isAsap() {
			return true;
		}


	}
	
	public boolean isUnicoItemSelecionado() {

		Set itensSelecionados = listagem.getSelecionados();

		// Verifica se o numero de itens selecionados eh maior que zero.
		if (itensSelecionados.size() == 1) {
			return true;
		} else {
			try {
				String mensagem = NucleoMensagens
						.getMensagem(NucleoMensagens.MSG_NENHUM_ELEMENTO_SELECIONADO);
				if (itensSelecionados.size() > 1) {
					mensagem = NucleoMensagens
							.getMensagem(NucleoMensagens.MSG_SELECIONE_APENAS_UM_ITEM);

				}
				Messagebox.show(mensagem, NucleoMensagens
						.getMensagem(NucleoMensagens.TERMO_AVISO), 1,
						Messagebox.INFORMATION);

			} catch (Exception e) {

				CtrlExcecoes.tratarExcecaoInterfaceGrafica(e,
						"Erro ao selecionar Registro");
			}

		}
		return false;
	}

}
